package beans;


import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import com.icesoft.faces.context.effects.JavascriptContext;

import pojo.Evento;
import util.DateComparator;
import util.Utility;


@ManagedBean(name="eventiBean")
@RequestScoped
public class EventiBean{

	@ManagedProperty(value="#{connectionBean}")
	private ConnectionBean connectionBean;
    
	private String seleziona = "Tutti";
	private List concerti = null;
    private Evento dettaglio = null;
    private List nightlife = null;
    private List spettacoli = null;
    private List cultura = null;
	private List eventi = null;
	private int numberRows;
	private String catSel = null;
    private String tipSel = "Tutti";
	private SelectItem[]tipi = null;
    private SelectItem[] categorie = null;
    private Date today;
    private Date week;
	private  final String DATE_PATTERN = "dd-MM";
	private  final String HOUR_PATTERN = "HH:mm";
    

	public EventiBean() {
		//JavascriptContext.includeLib("http://maps.google.com/maps?file=api&amp;v=2&amp;key=AIzaSyDijvq2gJNY9m6w4-lST3U3czPC2vfoa4g", FacesContext.getCurrentInstance()); 
		dettaglio = new Evento();
		numberRows = 6;
  	    Calendar grego = GregorianCalendar.getInstance(Utility.timeZone);
  	    setToday(grego.getTime());
  	    //grego.setTime(getToday());
        grego.add(GregorianCalendar.DATE, 7);
        setWeek(grego.getTime());
        

	}
	
	public List getCultura() {
		if(cultura!=null)
			return cultura;
	
		else{
			String settimana = Utility.toStringDataXml(week);
			ConnectionBean connec = getConnectionBean();
			cultura = connec.doQueryEventiSaxon("Arte e Cultura",null,settimana);
			Collections.sort(cultura,new DateComparator());

			return cultura;
			
		}
	}
	
	public List getSpettacoli() {
		if(spettacoli!=null)
			return spettacoli;
	
		else{
			String settimana = Utility.toStringDataXml(week);
			ConnectionBean connec = getConnectionBean();
			spettacoli = connec.doQueryEventiSaxon("Spettacoli",null,settimana);
			Collections.sort(spettacoli,new DateComparator());

			return spettacoli;
			
		}
	}
	public List getConcerti() {
		
		if(concerti!=null)
			return concerti;
	
		else{
			String settimana = Utility.toStringDataXml(week);
			ConnectionBean connec = getConnectionBean();
			concerti = connec.doQueryEventiSaxon("Concerti",null,settimana);
			Collections.sort(concerti,new DateComparator());

			return concerti;
			
		}

	}
	public List getEventi() {
		//TRANNE NIGHTLIFE PRENDIAMO EVENTI DA QUI A UNA SETTIMANA
        // O SE SONO SETTIMANALI PRENDO SETTIMANALI
		if(eventi!=null)
			return eventi;
	
		else{
			String settimana = Utility.toStringDataXml(week);
			ConnectionBean connec = getConnectionBean();
			eventi = connec.doQueryEventiSaxon("Eventi",null,settimana);
			Collections.sort(eventi,new DateComparator());
			return eventi;
			
		}

	}	
	
	//CERCHIAMO GLI EVENTI DI STASERA !!! AGGIUNGERE ORA AL DB EVENTI
	//BISOGNA VALUTARE EVENTI CON ORA FINE < ORA CORRENTE
	//POI EVENTI CHE HANNO DATA FINE > DI OGGI !!
	public List getNightlife() {
		
		if(nightlife!=null)
			return nightlife;
	
		else{
			
			ConnectionBean connec = getConnectionBean();
			String oggi = Utility.toStringDataXml(today);
			//eventi ordinati per data INIZIO
			
			nightlife = connec.doQueryEventiSaxon(null,null,oggi);
			Collections.sort(nightlife,new DateComparator());
			
			return nightlife;
			
		}

	}
	
    public SelectItem[] getTipi() {

		if(tipi!=null)
			return tipi;
	
		else{
			
			ConnectionBean connec = getConnectionBean();
			List tips = connec.doQueryTipiSaxon("evento");
			if(tips!=null){
				tipi = new SelectItem[tips.size()+1];
				tipi[0] = new SelectItem(getSeleziona(),getSeleziona());
				int i =1;
				for(Iterator it = tips.iterator();it.hasNext();){
					String tipo =  (String)it.next();
					SelectItem nuovo = new SelectItem(tipo,tipo);
					tipi[i]= nuovo;
					i++;
				}
				
			}else{
				tipi = new SelectItem[1];
				tipi[0] = new SelectItem(getSeleziona(),getSeleziona());
			}
			
			return tipi;
			
		}
	}



	public SelectItem[] getCategorie() {
		
		if(categorie!=null)
			return categorie;
	
		else{
			
			ConnectionBean connec = getConnectionBean();
			List cats = connec.doQueryCategorieSaxon();
			if(cats!=null){
				categorie = new SelectItem[cats.size()+1];
				categorie[0] = new SelectItem(getSeleziona(),getSeleziona());
				int i =1;
				for(Iterator it = cats.iterator();it.hasNext();){
					String cat =  (String)it.next();
					SelectItem nuovo = new SelectItem(cat,cat);
					categorie[i]= nuovo;
					i++;
				}
				
			}else{
				categorie = new SelectItem[1];
				categorie[0] = new SelectItem(getSeleziona(),getSeleziona());
			}
			return categorie;
		}
	}
	
	public void setTipi(SelectItem[] tipi) {
		this.tipi = tipi;
	}

	public void setCategorie(SelectItem[] categorie) {
		this.categorie = categorie;
	}

    public String getCatSel() {
		return catSel;
	}

	public void setCatSel(String catSel) {
		this.catSel = catSel;
	}

	public String getTipSel() {
		return tipSel;
	}

	public void setTipSel(String tipSel) {
		this.tipSel = tipSel;
	}


	public ConnectionBean getConnectionBean()
    {
        return connectionBean;
    }

    public void setConnectionBean(ConnectionBean conn)
    {
        this.connectionBean = conn;
    }
    public void dettaglioListener(ActionEvent e) {
       
    	Map<String, Object>attrs= e.getComponent().getAttributes();
    	Evento id = (Evento) attrs.get("ident");
    	//System.out.println(id.getTitolo()+ " "+id.getIndirizzo());
    	setDettaglio(id);

    }

    public void rowsListener(ActionEvent e) {
        
    	setNumberRows(this.getNumberRows()+3);

    }
	public int getNumberRows() {
		return numberRows;
	}

	public void setNumberRows(int numberRows) {
		this.numberRows = numberRows;
	}

 	public void onChangeCat(ValueChangeEvent evnt) {
 		//System.out.println("onChangeCat");
 		//System.out.println(getCatSel());
 		
 	}
 	//il vecchio valore si trova nella var globale
 	public void onChangeNightTipo(ValueChangeEvent evnt) {
        
 		//System.out.println(evnt.getOldValue());
 		//System.out.println(evnt.getNewValue());
 		this.setTipSel((String)evnt.getNewValue());
 	/*
 		if (evnt.getNewValue().equals(seleziona))
 			nightlife = null;
 		else{
 			nightlife = null;
 			nightlife = this.getNightlife();
 			List newnight = new ArrayList<Evento>();
 			for (Iterator it = nightlife.iterator();it.hasNext();){
 				Evento ev = (Evento)it.next();
 				if(ev.getTipo().equals(evnt.getNewValue()))
 					newnight.add(ev);
 			}
 			nightlife = newnight;
 		}
 		
 		*/
 		
 		
 		//se new value Tipo ==  Seleziona e oldValue Categorie
 		//== Seleziona allora tipi = null!
 		//altrimenti filtra per valre tipo nuovo e valore
 		//vecchio categoria con ArrayList SelectItems
 	}   
	public Evento getDettaglio() {
		
			String id = Utility.toString(dettaglio.getId());
			ConnectionBean connec = getConnectionBean();
			dettaglio = connec.doQueryEventoSaxon(id);
			return dettaglio;
			
		
	}

	public void setDettaglio(Evento dettaglio) {
		this.dettaglio = dettaglio;
	}
	   public String getSeleziona() {
			return seleziona;
		}

		public void setSeleziona(String seleziona) {
			this.seleziona = seleziona;
		}


		public void setSpettacoli(List spettacoli) {
			this.spettacoli = spettacoli;
		}

		public void setCultura(List cultura) {
			this.cultura = cultura;
		}

	    public void setEventi(List eventi) {
			this.eventi = eventi;
		}

		public String getDATE_PATTERN() {
			return DATE_PATTERN;
		}

		public String getHOUR_PATTERN() {
			return HOUR_PATTERN;
		}

		public Date getToday() {
			return today;
		}

		public void setToday(Date today) {
			this.today = today;
		}

		public Date getWeek() {
			return week;
		}

		public void setWeek(Date week) {
			this.week = week;
		}

		   public void setConcerti(List concerti) {
				this.concerti = concerti;
			}

			public void setNightlife(List nightlife) {
				this.nightlife = nightlife;
			}

}
